Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate复合密钥联接_Java_Spring_Hibernate - Fatal编程技术网

Java Hibernate复合密钥联接

Java Hibernate复合密钥联接,java,spring,hibernate,Java,Spring,Hibernate,我试图使用Spring数据执行连接查询,但我的一个表有一个复合键,我不知道如何映射实体 以下是数据模型的类比: table: device pk=model_id pk=serial_id ... table: device_settings pk=device_settings_id fk=model_id fk=serial_id ... 这里是代码的一个类比,由于不存在“mappedby”属性,代码无法编译 @Entity @Table(name = "device_settings"

我试图使用Spring数据执行连接查询,但我的一个表有一个复合键,我不知道如何映射实体

以下是数据模型的类比:

table: device
pk=model_id
pk=serial_id
...

table: device_settings
pk=device_settings_id
fk=model_id
fk=serial_id
...
这里是代码的一个类比,由于不存在“mappedby”属性,代码无法编译

@Entity
@Table(name = "device_settings")
public class DeviceSettings {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "device_settings_id")
    private Long id;

    // Pretty sure this is the problem
    @OneToMany(targetEntity = Device.class, mappedBy = "deviceKey", cascade = {CascadeType.MERGE}, fetch = FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name = "model_id", referencedColumnName = "model_id"),
        @JoinColumn(name = "serial_id", referencedColumnName = "serial_id")})
    private List<Device> devices;
}

@Entity
@Table(name = "device")
public class Device {
    @Id
        private DeviceKey deviceKey;
    }
    ...
}


@Embeddable
public class DeviceKey implements Serializable {
    private static final long serialVersionUID = -1943684511893963184L;

    @Column(name = "model_id")
    private Long modelId;

    @Column(name = "serial_id")
    private Short serialId;
}
@实体
@表(name=“设备设置”)
公共类设备设置{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“设备设置\u id”)
私人长id;
//很确定这就是问题所在
@OneToMany(targetEntity=Device.class,mappedBy=“deviceKey”,cascade={CascadeType.MERGE},fetch=FetchType.EAGER)
@连接柱({
@JoinColumn(name=“model\u id”,referencedColumnName=“model\u id”),
@JoinColumn(name=“serial\u id”,referencedColumnName=“serial\u id”)})
私有列表设备;
}
@实体
@表(name=“设备”)
公共类设备{
@身份证
专用设备密钥设备密钥;
}
...
}
@可嵌入
公共类DeviceKey实现可序列化{
私有静态最终长serialVersionUID=-1943684511893963184L;
@列(name=“model\u id”)
私有长modelId;
@列(name=“serial\u id”)
私有短序列号;
}
标记为mappedBy的关联不能定义@JoinTable或@JointColumn之类的数据库映射

要实现您的场景,您必须定义@ManyToOne:

@ManyToOne(cascade = {CascadeType.MERGE}, fetch = FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name = "model_id", referencedColumnName = "model_id"),
        @JoinColumn(name = "serial_id", referencedColumnName = "serial_id")})
     private Device device;
这将导致型号id、序列id、设备设置id

在设备实体中定义@JoinColumn 实体:

设备设置

    @Entity
    @Table(name = "device_settings")
    public class DeviceSettings {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "device_settings_id")
        private Long id;


        @OneToMany( mappedBy = "deviceSettings", cascade = {CascadeType.MERGE}, fetch = FetchType.EAGER)
         private List<Device> devices;
}
@Entity
@Table(name = "device")
public class Device {

        @EmbeddedId
        private DeviceKey deviceKey;

        @ManyToOne
        @JoinColumn(name="device_settings_id")
        private DeviceSettings deviceSettings;
       //getters and setters
}

注意:您可以决定哪一个是关系的所有者,并适当地放置映射—一个设备有许多设备设置,或者其他方式。

谢谢,这样确实可以编译,但这让我想知道如何利用关系的非所有者的Spring数据……我可以调用.findOne()这一简单事实一个实体上的方法与一个急切获取策略相结合,将始终为我提供在任意一侧执行CRUD操作的能力?谢谢您的回答。@JonasJSchreiber是的,这是正确的,但是您仍然可以使用延迟获取,只要它在服务级别得到了处理。如果您有任何困难,请告诉我们。我想我可能对这种映射的递归性质有问题。如果需要持久化实体,并且每个实体都引用另一个实体,难道你不能在调试器中深入研究对象并看到它们无限地相互引用吗?@JonasJSchreiber是的,如前所述,这取决于实体关系和级联操作。因为级联只用于合并,所以不会有问题。如果你有任何问题,让我们在另一个问题中讨论