2012-04-23 2 views
0

実行時に生成されたエンティティのUUIDを別のフィールドにコピーしたいとします。 エンティティIDは、コードを介して生成される蛇腹説明:持続時間でエンティティIDをコピー

package eclipselink.example; 
public class UUIDSequence extends Sequence implements SessionCustomizer { 
    public UUIDSequence() { 
     super(); 
    } 
    public UUIDSequence(String name) { 
     super(name); 
    } 
    @Override 
    public Object getGeneratedValue(Accessor accessor, 
      AbstractSession writeSession, String seqName) { 
     return UUID.randomUUID().toString().toUpperCase(); 
    } 
    ... 
    public void customize(Session session) throws Exception { 
     UUIDSequence sequence = new UUIDSequence("system-uuid"); 
     session.getLogin().addSequence(sequence); 
    } 
} 

Persitence.xml:

property name="eclipselink.session.customizer" value="eclipselink.example.UUIDSequence" 

エンティティ:

public abstract class MyEntity{ 
    private String id; 
    private String idCopy; 

    @Id 
    @Basic(optional = false) 
    @GeneratedValue(generator="system-uuid") 
    @XmlElement(name = "ID") 
    public String getId() { 
     return id; 
    } 
} 

どのようにJPA(Eclipseのリンク)を指示することができるが実行時に生成されたUUIDをidCopyフィールドにコピーしますか?

答えて

0

私は、これは(のEclipseLinkはセッターを呼び出したり、直接フィールドを割り当てた場合、私は知らない)動作しますが、これを試してみてます100%わからない:このソリューションが可能です

public abstract class MyEntity{ 
    private String id; 
    private String idCopy; 

    @Id 
    @Basic(optional = false) 
    @GeneratedValue(generator="system-uuid") 
    @XmlElement(name = "ID") 
    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
     this.idCopy = id; 
     // or 
     // this.setIdCopy(id); 
    } 
} 
+0

が、 MyEntityからのエンティティの継承の場合、別のidCopy値が必要な場合があります(たとえば、idCopyをルート親のidで設定するなど)。代わりに@PrePersistを使用することは可能ですか? Eclipse Linkは永続性の前にUUIDの存在を保証していますか? – user1062078

+0

子孫クラスの 'setId()'をいつでもオーバーライドして、異なる動作をさせることができます。 @PrePersistについてはわかりませんが、動作を自分でテストするのは簡単なはずです。 –

関連する問題