阻止Hibernate更新现有记录

sha*_*wsy 4 java sql hibernate java-ee

我试图让hibernate在每次执行保存时写入新对象而不是更新现有记录.

public class Risk {
    private long riskID;
    private Vehicle vehicle;
}

public class Vehicle {  
    private long vehicleID;
    private long riskID;
    private String regNumber;
    private String abiCode;
    private String make;
    private String model;
}
Run Code Online (Sandbox Code Playgroud)

所以如果把风险写入DB.然后我在网上更换车辆,并尝试再次将风险保存到数据库.我想在风险表中有两个风险,在车辆表中有两个车辆.

目前我正在使用hibernate会话Save(Object o).这总是在数据库中造成新风险,但从未创建新车辆.它只是更新原始的.

这是我的映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class lazy="false" name="uk.co.test.Risk" schema="quote_engine" table="GV_RISK" >
    <id column="riskID" name="riskID" type="long">
        <generator class="identity"/>
    </id>

    <many-to-one name="vehicle" class="uk.co.test.Vehicle" column="vehicleID" not-null="true" cascade="all" unique="true" />

</class>
Run Code Online (Sandbox Code Playgroud)

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="uk.co.test.Vehicle" schema="quote_engine" table="GV_VEHICLE">

    <id name="vehicleID" type="long" column="vehicleID">
        <generator class="identity" />
    </id>

    <property name="regNumber" type="string" column="regNumber" />
    <property name="abiCode" type="string" column="abiCode" />
    <property name="make" type="string" column="make" />
    <property name="model" type="string" column="model" />


</class>
Run Code Online (Sandbox Code Playgroud)

Tim*_*ote 6

我真的怀疑是否有可能让Hibernate自动神奇地做到这一点.您想要覆盖ORM的一个最基本的行为.他们的整个包是在一些Session中跟踪你的对象,以便将这些更新保存到数据库,而无需你自己对这些更新进行排序.

如果您不希望更新记录,请将您的setter设为私有并注释您的字段,以便获得字段访问权限.在xml中,default-access="field"<hibernate-mapping>标记上设置属性.

然后,您需要先创建一个新对象,然后再将其添加到会话中.使用如下所示的方法获得服务:

public void saveVehicle(Vehicle vehicle) {
  Vehicle vehicleNew = vehicle.copy();
  // Risk would be copied via risk.copy() in vehicle.copy()

  vehicleDao.save(vehicleNew)
}
Run Code Online (Sandbox Code Playgroud)