java - @ManyToOne 和 @OneToOne 与 @EmbeddedId 的关系

标签 java sql database jpa one-to-many

我正在尝试将数据库实体的 id 从单个 long 更改为由两个 long 组成的复合 id,这两个 long 封装在我的 ID.class 中,如下所示。您会为 ManyToOne 和 OneToMany 关系使用什么注释?我的注释是否有错误,尤其是 @JoinColumns、@Embeddable 和 @EmbeddedId。我的问题是关系存储为 null;

我的 ID 类由自动生成的长整型 (pid) 和手动设置的辅助长整型 (sid) 组成。这是我所有实体类的 ID:

@Embeddable
public class ID implements Serializable {

    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long pid;
    @Column(nullable=false)
    private long sid;
}

我的实体类(示例)与 Office 具有多对一关系,与设置具有一对一关系(两种关系都是单向的)。

@Entity
@Table(name="user")
public class User {

    @EmbeddedId
    private ID id;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = "office_pid", referencedColumnName = "pid", updatable=false, insertable=false),
        @JoinColumn(name = "office_sid", referencedColumnName = "sid", updatable=false, insertable=false)
    })
    private Office office;

    @OneToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE}, fetch=FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = "setting_pid", referencedColumnName = "pid", updatable=false, insertable=false),
        @JoinColumn(name = "setting_sid", referencedColumnName = "sid", updatable=false, insertable=false)
    })
    private Settings setting;

    @OneToMany(mappedBy = "user", cascade=CascadeType.REMOVE, fetch=FetchType.LAZY)
    private List<Account> accounts= new ArrayList<>();
}

Office 类(多对一示例):

@Entity
@Table(name = "office")
public class Office {

    @EmbeddedId
    private ID id;
    @Column(length = 128)
    private String description;

}

帐户类别(一对多示例):

@Entity
@Table(name="account")
public class Account {

    @EmbeddedId
    private ID id;
    @Column(length = 16)
    private String description;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = "user_pid", referencedColumnName = "pid"),
        @JoinColumn(name = "user_sid", referencedColumnName = "sid")
    })
    private User user;
}

预先感谢您的帮助。

最佳答案

如果您想要复合 pk,则不应使用排序 - 仅使用唯一的序列生成字段,或唯一的复合业务字段。

第二个问题是 User 中的 joinColumn 定义。您已将它们标记为 updatable=false、insertable=false,这意味着外键无法通过映射进行更改,这就是为什么无论设置关系如何它们始终为 null 的原因。删除每个设置中的 updateable=false、insertable=false 设置,以便在设置关系时设置字段。

关于java - @ManyToOne 和 @OneToOne 与 @EmbeddedId 的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25264994/

相关文章:

JAVA:使用数组定义屏幕上对象的 X 位置和移动

sql - 是否安装了全文搜索

sql - 如何清理 C 或 Objective-C 中的数据库输入?

c++ - 使用 C++ 打印数据库中的所有列

sql-server - 我如何将命令传递给 sqsh 并一次性将输出输出到文件?

Java 使用冒泡排序对 ArrayList 进行排序

java - 在注销期间是否足以破坏用户 session ?

java - Log4j 解析错误在 SMTPAppender 上添加 triggeringPolicy

sql - Sequelize : overlapping - Checking if any value in array matches any value in the passed array

php - 在大型论坛中开发快速搜索功能?