gpt4 book ai didi

java - Hibernate @ManyToOne 引用类使用@NaturalId 而不是@Id

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:57 39 4
gpt4 key购买 nike

我有一些允许我创建关联类的 Hibernate/JPA 注释(老实说仍然不知道区别)。此类将两个相关的项目组合成一个对象。我最初使用的是 @JoinTable,但意识到我需要更多具有关联的元数据,因此不得不将代码转换为另一种对象类型。

现在我使用 @Id 为我的对象标记 ID 列,并使用 @NaturalId (mutable = false) 为一个 String uuid

我的关联类正在使用 @ManyToOne 并很好地创建表,但是当我查看它时,该表正在使用 @Id 字段作为映射列。我希望这个关联类使用 @NaturalId uuid 以便于将关系/关联转移到其他系统。

如何让关系使用正确的标识符?

作为引用,我的数据库和 Java 代码如下所示:

AssociationsTable
----------------------------------------------
| ID | META DATA | ID ASSOC. 1 | ID ASSOC. 2 |
----------------------------------------------
| 1 | stuff | 1 | 2 |
----------------------------------------------

Objects
------------------------------
| ID | META DATA | UUID |
------------------------------
| 1 | stuff | FOO-123 |
------------------------------
| 2 | stuff | BAR-456 |
------------------------------

Association Class{
ObjA main;
ObjA sub;

@ManyToOne
getMain()

@ManyToOne
getSub()
}

ObjA Class{
Long id;
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
@XmlElement
@Column(name = "ID", unique = true, nullable = false)
getId()

String uuid;
@NaturalId (mutable = false)
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(name = "uuid", unique = true)
getUUID()
}

最佳答案

您可以使用 referencedColumnName @JoinColumn 的属性,如前所述here .因此,对于您的示例,映射应如下所示:

ObjA.java:

package hello;

import org.hibernate.annotations.NaturalId;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class ObjA {
Long id;
String uuid;

public ObjA() {
}

public ObjA(String uuid) {
this.uuid = uuid;
}

@Id
@GeneratedValue
@Column(name = "obj_a_id", unique = true, nullable = false)
Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

@NaturalId(mutable = false)
@Column(name = "uuid", unique = true, nullable = false)
public String getUuid() {
return uuid;
}

public void setUuid(String uuid) {
this.uuid = uuid;
}
}

关联.java:

package hello;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Association {
Long id;
ObjA main;
ObjA sub;

public Association() {
}

public Association(ObjA main, ObjA sub) {
this.main = main;
this.sub = sub;
}

@Id
@GeneratedValue
@Column(name = "association_id", unique = true, nullable = false)
Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

@ManyToOne
@JoinColumn(name = "main_uuid", referencedColumnName = "uuid", nullable = false)
public ObjA getMain() {
return main;
}

public void setMain(ObjA main) {
this.main = main;
}

@ManyToOne
@JoinColumn(name = "sub_uuid", referencedColumnName = "uuid", nullable = false)
public ObjA getSub() {
return sub;
}

public void setSub(ObjA sub) {
this.sub = sub;
}
}

这些映射已成功测试以存储来自 uuid 的值obja 的专栏main_uuid 中的表和 sub_uuid association 的列 table 。这是使用 org.hibernate.common:hibernate-commons-annotations:4.0.5.Final 测试的, org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final , org.hibernate:hibernate-core:4.3.10.Final , 和 org.hibernate:hibernate-entitymanager:4.3.10.Final针对 PostgreSQL 9.4.4。

关于java - Hibernate @ManyToOne 引用类使用@NaturalId 而不是@Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32013246/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com