2

JPA を使用してエンティティを永続化すると、バージョン列が更新/設定されません。私は休止状態のJPAを使用しています。バージョンは自動作成されますか、それとも手動で作成する必要がありますか?

抽象基本クラスがあります

@MappedSuperclass 
public abstract  class AbstractDomainEO {

private Date createdDate;
@Version 
private Integer version;

public Integer getVersion() {
    return version;
}

public void setVersion(Integer version) {
    this.version = version;
}

および抽象クラスを拡張するサブエンティティクラス

@SuppressWarnings("serial")
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("GENERIC")
public class ArtData extends AbstractDomainEO  implements DomainObject {

更新#2 ....だから、バージョンを機能させるためだけに、継承のない別の単純なクラスを使用することにしましたが、運もありません。私の新しいクラス:

@Entity
@Table(name = "CAR")
public class CarEO implements Car {

private Date createdDate;

@Version 
private Integer version;

public Integer getVersion() {
    return version;
}
public void setVersion(Integer version) {
    this.version = version;
}

public void setCreatedDate(Date createdDate) {
    this.createdDate = createdDate;
}

@Temporal(TemporalType.TIMESTAMP)
public Date getCreatedDate() { 
    return this.createdDate; 
}


@Id
@GeneratedValue
@Column(name = "CAR_ID")
private Integer id;
private String name;
public CarEO() {
    super();
}

@Override
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CAR_ID_SEQ")   
public Integer getId() {
    return this.id;
}

@Override
public void setId(Integer id) {
    this.id = id;
}

@Override
public String getName() {
    return this.name;
}

@Override
public void setName(String name) {
    this.name = name;
}

ただし、バージョンと createDate に対してはまだ null を取得します(ただし、これは別の問題です)

CarEO[createdDate=,version=0,id=3,name=bmw,comments=[]]

これは、作成しようとしたときの出力です。この EO オブジェクトの削除を選択します。

[org.hibernate.cache.StandardQueryCache]; デフォルトを使用します。[DEBUG] org.hibernate.SQL:111 - CAR (CAR_ID、createdDate、name、version) 値 (null、?、?、?) に挿入する

Hibernate: CAR (CAR_ID、createdDate、name、version) 値 (null、?、?、?) に挿入します。

[INFO] CarDaoJPASpringTest:64 - * ** * ** * ** * **** [DEBUG] org.hibernate.SQL:111 - careo0_.CAR_ID を CAR1_1_ として、careo0_.createdDate を createdD2_1_ として、careo0_.name を name1_ として選択します。 、careo0_.version を CAR careo0_ から version1_ として

ハイバネート: CAR careo0_ から careo0_.CAR_ID を CAR1_1_ として、careo0_.createdDate を createdD2_1_ として、careo0_.name を name1_ として、careo0_.version を version1_ として選択します。

CarEO[createdDate=,version=0,id=3,name=bmw,comments=[]] [DEBUG] org.hibernate.SQL:111 - CAR_ID=? の CAR から削除します。バージョン=? 休止状態: CAR_ID=? の CAR から削除します。バージョン=?

4

1 に答える 1

0

使い方がわかりずらいMappedSuperClassです。はクエリ可能ではなく、または操作 Mapped superclassesでは使用できません。にDB操作を行うとの操作を行います。今、あなたが にいるので問題です。この問題を回避するには、またはクラスに入れる必要があります。EntityManagerQueryEntityManagerQueryversionEntityManagerArtDataversionMappedSuperClassversionEntityPOJO

例 1

@MappedSuperclass 
public abstract  class AbstractDomainEO {
    private Date createdDate;
}

@SuppressWarnings("serial")
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("GENERIC")
public class ArtData extends AbstractDomainEO  implements DomainObject {

    @Version 
    private Integer version;

    public Integer getVersion() {
        return version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }
}

例 2

@Entity
public abstract class Parent {
    @Version 
    private Integer version;

    public Integer getVersion() {
        return version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }
}

@MappedSuperclass 
public class AbstractDomainEO extends Parent {
    private Date createdDate;
}

@SuppressWarnings("serial")
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("GENERIC")
public class ArtData extends AbstractDomainEO  implements DomainObject {

}

参照MappedSuperclass

于 2012-11-10T05:21:45.243 に答える