powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate две сущности в третьей через аннотации
8 сообщений из 8, страница 1 из 1
hibernate две сущности в третьей через аннотации
    #40018944
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Можно ли сделать такое на аннотациях hibernate?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class EntityA {
    @JoinColumn(name = "USER_FK")
    @OneToOne(fetch = FetchType.LAZY, optional = true)
    private User user;
	
    // пробовал так, entityB не грузит
    // @JoinColumn(name = "USER_FK", referencedColumnName = "USER_FK", insertable = false, updatable = false)
    private EntityB entityB;
}

public class EntityB {
    @JoinColumn(name = "USER_FK")
    @OneToOne(fetch = FetchType.LAZY, optional = true)
    private User user;
}

public class User {
    @Id
    @GeneratedValue(generator = "USER_SEQUENCE_GENERATOR")
    private Long id;
}
...
Рейтинг: 0 / 0
hibernate две сущности в третьей через аннотации
    #40019015
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
am_sasa,

Один к одному это не FK
...
Рейтинг: 0 / 0
hibernate две сущности в третьей через аннотации
    #40019425
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
am_sasa,

Один к одному это не FK

Все правильно, подправил.

На просторах инета нашел такое решение:
Код: java
1.
2.
3.
4.
5.
@JoinColumnsOrFormulas({
   @JoinColumnOrFormula(formula=
	@JoinFormula(value = "(SELECT e.id FROM EntityB e WHERE e.USER_FK = USER_FK)", referencedColumnName = "id"))
})
private EntityB entityB;

работает
...
Рейтинг: 0 / 0
hibernate две сущности в третьей через аннотации
    #40019463
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если там все связи один к одному, то оно вроде и так работает:

Java:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Persistence;
import javax.persistence.Table;

public class Test {
	public static void main(String[] args) {
		
		EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("PersistanceUnitName");
		EntityManager entityManager = entityManagerFactory.createEntityManager();
		entityManager.getTransaction().begin();
		
		User user1 = new User();
		User user2 = new User();
		user1.setName("User1");
		user2.setName("User2");
		
		EntityA entityA = new EntityA();
		EntityB entityB = new EntityB();
		
		entityB.setName("EntityB");
		entityB.setUser(user2);
		
		entityA.setName("EntityA");
		entityA.setUser(user1);
		entityA.setEntityB(entityB);
		
		entityManager.persist(entityA);
		
		entityManager.getTransaction().commit();
		entityManager.close();
		entityManagerFactory.close();

	}
}

@Entity(name = "EntityA")
@Table(name = "EntitiesA")
class EntityA {
	
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
	@OneToOne(cascade = CascadeType.PERSIST)
	@JoinColumn(name = "user_id", insertable = false, updatable = false)
    private User user;
	@OneToOne(cascade = CascadeType.PERSIST)
	@JoinColumn(name = "entityb_id", insertable = false, updatable = false)
    private EntityB entityB;
	private String name;

    public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public EntityB getEntityB() {
		return entityB;
	}
	public void setEntityB(EntityB entityB) {
		this.entityB = entityB;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Long getId() {
		return id;
	}
    
}

@Entity(name = "EntityB")
@Table(name = "EntitiesB")
class EntityB {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
	@JoinColumn(name = "user_id", insertable = false, updatable = false)
    private User user;
    private String name;

	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Long getId() {
		return id;
	}
    
}

@Entity(name = "User")
@Table(name = "Users")
class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

	public Long getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
    
}



Database:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE TABLE `entitiesa` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `entityb_id` bigint(20) DEFAULT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FKs39jadgpbiwlu4ot4g4hya1bx` (`entityb_id`),
  KEY `FKdvwmvgd04gat1yr3j4vy4abi6` (`user_id`),
  CONSTRAINT `FKdvwmvgd04gat1yr3j4vy4abi6` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`),
  CONSTRAINT `FKs39jadgpbiwlu4ot4g4hya1bx` FOREIGN KEY (`entityb_id`) REFERENCES `entitiesb` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

CREATE TABLE `entitiesb` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FKm378mtk9ceppwy60dok40bowk` (`user_id`),
  CONSTRAINT `FKm378mtk9ceppwy60dok40bowk` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

CREATE TABLE `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

...
Рейтинг: 0 / 0
hibernate две сущности в третьей через аннотации
    #40019504
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя тут я так понимаю EntityA.User = EntityA.EntityB.User.
...
Рейтинг: 0 / 0
hibernate две сущности в третьей через аннотации
    #40019524
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen
Хотя тут я так понимаю EntityA.User = EntityA.EntityB.User.

в общем это понятно, однако поля "entityb_id" не должно быть, у нас только "USER_FK".
...
Рейтинг: 0 / 0
hibernate две сущности в третьей через аннотации
    #40019658
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot am_sasa#22233733]
PetroNotC Sharp
am_sasa,
На просторах инета нашел такое решение:
Код: java
1.
2.
3.
4.
5.
@JoinColumnsOrFormulas({
   @JoinColumnOrFormula(formula=
	@JoinFormula(value = "(SELECT e.id FROM EntityB e WHERE e.USER_FK = USER_FK)", referencedColumnName = "id"))
})
private EntityB entityB;

работает


У меня пример заработал с
Код: java
1.
@JoinFormula(value = "(SELECT e.id FROM EntityB e WHERE e.USER_FK = USER_FK)", referencedColumnName = "id"))

.
@JoinColumnsOrFormulas помойму лишняя.

Правда работает только в паре с @ManyToOne.
Кто нибудь вкурсе @JoinFormula + @OneToOne работают ?
...
Рейтинг: 0 / 0
hibernate две сущности в третьей через аннотации
    #40019672
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen,
Если модель в бд логичная. То все будет работать.
От бд надо идти.
Схему бд рисовать
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate две сущности в третьей через аннотации
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]