1

共有主キーを使用して双方向の1対1の関係を作成したかったのです。

ここで述べられているように、JPAHibernateの1対1の関係は次のとおりです。

@Entity
public class UserProfileInformation {

    @Id
    @GeneratedValue(generator = "customForeignGenerator")
    @org.hibernate.annotations.GenericGenerator(
        name = "customForeignGenerator",
        strategy = "foreign",
        parameters = @Parameter(name = "property", value = "userEntity")
    )
    long id;

    private long itemsPerPage;

    @OneToOne(mappedBy="userProfileInformation")
    private UserEntity userEntity;
...}

@Entity
@Table(name = "UserTable")
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String publicName;

    private String password;

    private String emailAddress;

    private String name; 

    private boolean active;

    @OneToOne(cascade=CascadeType.ALL)
    @PrimaryKeyJoinColumn
    private UserProfileInformation userProfileInformation;
...}

今、データベースにユーザーを永続化しようとすると、が取得されorg.hibernate.id.IdentifierGenerationException: null id generated for:class pl.meble.taboret.model.UserProfileInformationます。userProfileInformationがデータベースに永続化されている場合、userEntityにはその時点で生成されたIDがないためですか?

また、私の例では、共有主キーとの双方向の関係を作成するために何ができますか?

編集:要求されたコード、これは永続化するUserEntityの動作をテストするための単純なコントローラーです。

@Controller
@RequestMapping("/test")
public class TestController {
    @Autowired
    UserDao userDao;

    @RequestMapping(method= RequestMethod.GET)
    public String t(Model model){
        UserEntity entity=new UserEntity();
        entity.setActive(false);
        entity.setEmailAddress("a");
        entity.setName("name");
        entity.setPassword("qqq");
        entity.setPublicName("p");
        UserProfileInformation p = new UserProfileInformation(entity);
        entity.setUserProfileInformation(p);
        userDao.addUser(entity);
        return "login";
    }
}
4

1 に答える 1

1

問題はID生成戦略にあると思います。休止状態の場合、識別子の生成@GeneratedValue(strategy = GenerationType.AUTO)に変換されます。nativeこれは、hibernateidentityがUserTableのidフィールドを予期していることを意味します。

SQLiteID列の観点からどのように機能するかは正確にはわかりませんが、このSOの質問からは少し異なるようです(2番目の回答を参照)。

とにかく、アプリケーションを複数のデータベースで実行することを計画している場合は、移植性のためにID生成戦略を変更し、GenerationType.AUTOHibernate拡張ジェネレーターを使用する方が優れています:SequenceStyleGeneratorまたはTableGenerator。Hibernateドキュメントのこのリンクを参照してください。

編集:

私はあなたの問題を再現しようとしましたが、SQLite方言は公式にサポートされている休止状態の方言には含まれていないようです。その間、H2埋め込みデータベースを使用してケースをテストしましたが、期待どおりに機能します。マッピングは正しいです。

非公式のSQLite方言を使用している場合は、この方言のバグである可能性があります。

于 2012-09-09T16:17:25.713 に答える