标签: jpa

使用额外列映射多对多关联表

我的数据库包含3个表:用户和服务实体具有多对多关系,并与SERVICE_USER表连接,如下所示:

用户 - SERVICE_USER - 服务

SERVICE_USER表包含其他BLOCKED列.

执行此类映射的最佳方法是什么?这些是我的实体类

@Entity
@Table(name = "USERS")
public class User implements java.io.Serializable {

private String userid;
private String email;

@Id
@Column(name = "USERID", unique = true, nullable = false,)
public String getUserid() {
return this.userid;
}

.... some get/set methods
}

@Entity
@Table(name = "SERVICES")
public class CmsService implements java.io.Serializable {
private String serviceCode;

@Id
@Column(name = "SERVICE_CODE", unique = true, nullable = false, length = 100)
public String getServiceCode() {
return this.serviceCode;
}
.... …
Run Code Online (Sandbox Code Playgroud)

mapping many-to-many hibernate jpa jointable

129
推荐指数
2
解决办法
11万
查看次数

JPA getSingleResult()或null

我有一个insertOrUpdate方法,它插入一个Entity不存在的方法或更新它,如果它.要启用它,我必须findByIdAndForeignKey,如果它返回null插入,如果没有然后更新.问题是如何检查它是否存在?所以我试过了getSingleResult.但是如果它会引发异常

public Profile findByUserNameAndPropertyName(String userName, String propertyName) {
    String namedQuery = Profile.class.getSimpleName() + ".findByUserNameAndPropertyName";
    Query query = entityManager.createNamedQuery(namedQuery);
    query.setParameter("name", userName);
    query.setParameter("propName", propertyName);
    Object result = query.getSingleResult();
    if (result == null) return null;
    return (Profile) result;
}
Run Code Online (Sandbox Code Playgroud)

getSingleResult扔了一个Exception.

谢谢

java jpa

128
推荐指数
10
解决办法
19万
查看次数

JPA实体何时以及为何应该实现Serializable接口?

问题出在标题中.下面我刚才描述了我的一些想法和发现.

当我有非常简单的域模型(没有任何关系的3个表)时,我的所有实体都没有实现Serializable.

但是当域模型变得更复杂时,我得到了RuntimeException,它说我的一个实体没有实现Serializable.

我使用Hibernate作为JPA实现.

我想知道:

  1. 是特定于供应商的要求/行为吗?
  2. 我的可序列化实体会发生什么?它们是否可以序列化以便存储或传输?
  3. 在哪一刻,有必要使我的实体可序列化?

java orm serialization hibernate jpa

128
推荐指数
10
解决办法
7万
查看次数

对于大型项目,Spring Data JPA与Hibernate有何不同?

我很难决定是否应该坚持使用Hibernate来完成一个新项目,或者尝试使用JPA和新的Spring Data实现.

Spring Data框架是针对具有适度查询要求的大型项目还是小型项目?

虽然我通过使用@Query注释确实看到了减少代码的优势,但您对动态查询有何看法?当你想要实现一个非常复杂的save()方法时呢?

文档说明要创建主存储库实现的自定义接口和实现,但是如果需要访问crud存储库本身的任何超级方法呢?crud存储库实现了自定义存储库 - 而不是相反.这似乎是一个奇怪的设计.

我很不确定这个框架是否能够应对复杂和大型应用程序的挑战.我从未遇到过Hibernate的许多问题,而且我正在考虑坚持使用旧的可靠而不是使用Spring Data JPA.

我该怎么办?如果我使用Spring Data JPA,我会遇到哪些无法预料的并发症和成本?

java spring hibernate jpa spring-data-jpa

127
推荐指数
3
解决办法
8万
查看次数

单向和双向JPA和Hibernate关联有什么区别?

单向和双向关联有什么区别?

由于在db中生成的表都是相同的,因此我发现的唯一区别是双向关联的每一侧都将引用另一侧,而单向不引用.

这是一个单向关联

public class User {
    private int     id;
    private String  name;
    @ManyToOne
    @JoinColumn(
            name = "groupId")
    private Group   group;
}

public class Group {
    private int     id;
    private String  name;
}
Run Code Online (Sandbox Code Playgroud)

双向关联

public class User {
    private int     id;
    private String  name;
    @ManyToOne
    @JoinColumn(
            name = "groupId")
    private Group   group;
}
public class Group {
    private int         id;
    private String      name;
    @OneToMany(mappedBy="group")
    private List<User>  users;
}
Run Code Online (Sandbox Code Playgroud)

区别在于该组是否拥有用户的参考.

所以我想知道这是唯一的区别吗?哪个推荐?

java orm hibernate jpa associations

122
推荐指数
4
解决办法
10万
查看次数

Hibernate JPA序列(非Id)

对于某些不是标识符/不是复合标识符一部分的列,是否可以使用DB序列?

我正在使用hibernate作为jpa提供程序,并且我有一个表有一些生成值的列(使用序列),尽管它们不是标识符的一部分.

我想要的是使用序列为实体创建一个新值,其中序列的列不是主键的一部分:

@Entity
@Table(name = "MyTable")
public class MyEntity {

    //...
    @Id //... etc
    public Long getId() {
        return id;
    }

   //note NO @Id here! but this doesn't work...
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "myGen")
    @SequenceGenerator(name = "myGen", sequenceName = "MY_SEQUENCE")
    @Column(name = "SEQ_VAL", unique = false, nullable = false, insertable = true, updatable = true)
    public Long getMySequencedValue(){
      return myVal;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后,当我这样做:

em.persist(new MyEntity());
Run Code Online (Sandbox Code Playgroud)

将生成id,但该mySequenceVal属性也将由我的JPA提供程序生成.

只是为了说清楚:我希望HibernatemySequencedValue属性生成值.我知道Hibernate可以处理数据库生成的值,但是我不想使用触发器或除Hibernate之外的任何其他东西来为我的属性生成值.如果Hibernate可以为主键生成值,为什么它不能为简单属性生成?

java hibernate jpa sequence

121
推荐指数
9
解决办法
11万
查看次数

我应该使用哪个注释:@IdClass或@EmbeddedId

JPA(Java持久性API)规范有2名不同的方式来指定实体组合键:@IdClass@EmbeddedId.

我在我的映射实体上使用了两个注释,但对于那些不熟悉的人来说,结果却是一团糟JPA.

我想只采用一种方法来指定复合键.哪一个真的最好?为什么?

java annotations jpa java-persistence-api

120
推荐指数
6
解决办法
8万
查看次数

Spring数据jpa中save和saveAndFlush的区别

我试图通过测试一些CRUD操作来学习弹簧数据JPA JpaRepository.

我碰到两个方法savesaveAndFlush.我没有区分这两者.在调用时save我的更改也被保存到数据库中,因此有什么用处saveAndFlush.

java spring hibernate jpa spring-data-jpa

119
推荐指数
3
解决办法
12万
查看次数

Spring JPA选择特定列

我正在使用Spring JPA来执行所有数据库操作.但是我不知道如何从Spring JPA中的表中选择特定的列?

例如:
SELECT projectId, projectName FROM projects

java jpa spring-data-jpa

119
推荐指数
9
解决办法
21万
查看次数

如何测试Spring Data存储库?

我想要一个UserRepository在Spring Data的帮助下创建的存储库(比方说).我是spring-data(但不是spring)的新手,我使用的是本教程.我选择处理数据库的技术是JPA 2.1和Hibernate.问题是我对如何为这样的存储库编写单元测试一无所知.

我们以create()方法为例.当我正在测试时,我应该为它编写单元测试 - 这就是我遇到的三个问题:

  • 首先,如何将一个模拟注入EntityManager一个UserRepository接口的不存在的实现?Spring Data将基于此接口生成实现:

    public interface UserRepository extends CrudRepository<User, Long> {}
    
    Run Code Online (Sandbox Code Playgroud)

    但是,我不知道如何强制它使用EntityManager模拟和其他模拟 - 如果我自己编写了实现,我可能会有一个setter方法EntityManager,允许我使用我的模拟进行单元测试.(至于实际的数据库连接,我有一个JpaConfiguration类,有注释@Configuration@EnableJpaRepositories,通过编程定义豆类DataSource,EntityManagerFactory,EntityManager等等-但库应该是测试友好,并允许重写这些事情).

  • 其次,我应该测试互动吗?这是我很难找出什么方法EntityManagerQuery应该被称为(类似于那个verify(entityManager).createNamedQuery(anyString()).getResultList();),因为它是不是我是谁写的实施.

  • 第三,我是否应该首先对Spring-Data生成的方法进行单元测试?据我所知,第三方库代码不应该进行单元测试 - 只有开发人员自己编写的代码应该进行单元测试.但如果这是真的,它仍然会将第一个问题带回现场:比方说,我的存储库有几个自定义方法,我将编写实现,如何注入我的模拟EntityManagerQuery进入最终,生成库?

注:我将使用测试驱动我的仓库集成和单元测试.对于我的集成测试,我使用的是HSQL内存数据库,显然我没有使用数据库进行单元测试.

也许第四个问题,在集成测试中测试正确的对象图创建和对象图检索是否正确(比方说,我有一个用Hibernate定义的复杂对象图)?

更新:今天我继续尝试模拟注入 - 我创建了一个静态内部类来允许模拟注入.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class UserRepositoryTest {

@Configuration
@EnableJpaRepositories(basePackages = …
Run Code Online (Sandbox Code Playgroud)

unit-testing jpa spring-data spring-data-jpa

119
推荐指数
8
解决办法
13万
查看次数