Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate две сущности в третьей через аннотации / 8 сообщений из 8, страница 1 из 1
16.11.2020, 16:25
    #40018944
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate две сущности в третьей через аннотации
Добрый день!

Можно ли сделать такое на аннотациях 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
16.11.2020, 17:57
    #40019015
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate две сущности в третьей через аннотации
am_sasa,

Один к одному это не FK
...
Рейтинг: 0 / 0
17.11.2020, 14:11
    #40019425
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate две сущности в третьей через аннотации
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
17.11.2020, 14:42
    #40019463
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate две сущности в третьей через аннотации
Если там все связи один к одному, то оно вроде и так работает:

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

в общем это понятно, однако поля "entityb_id" не должно быть, у нас только "USER_FK".
...
Рейтинг: 0 / 0
17.11.2020, 20:01
    #40019658
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate две сущности в третьей через аннотации
[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
17.11.2020, 20:28
    #40019672
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate две сущности в третьей через аннотации
faustgreen,
Если модель в бд логичная. То все будет работать.
От бд надо идти.
Схему бд рисовать
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate две сущности в третьей через аннотации / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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