标签: hibernate-mapping

使用JPA,如果给出比连接表更高级的查询,如何连接实体字段?

我正在使用Hibernate 4.1.3.Final与JPA 2.1和MySQL 5.5.37.我有一个具有以下字段的实体:

@Entity
@Table(name = "category",
       uniqueConstraints = { @UniqueConstraint(columnNames = { "NAME" })}
)
public class Category implements Serializable, Comparable<Category> {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID")
    @GeneratedValue(generator = "uuid-strategy")
    private String id;

    @NotEmpty
    private Set<Subject> subjects;

    ...
}
Run Code Online (Sandbox Code Playgroud)

没有简单的连接表来链接该subjects字段,而是有一个稍微复杂的MySQL查询.以下是给出特定类别ID的主题的示例:

SELECT DISTINCT e.subject_id 
FROM category c, resource_category rc, product_resource pr, 
     sb_product p, product_book pe, book e 
WHERE c.id = rc.category_id 
  AND rc.resource_id = pr.resource_id 
  AND pr.product_id = p.id 
  AND p.id …
Run Code Online (Sandbox Code Playgroud)

java mysql hibernate jpa hibernate-mapping

10
推荐指数
1
解决办法
803
查看次数

Hibernate多对一映射具有不同的列数

嗨我有2张桌子如下

表格1:


    +-------------------+
    | ID  LOB col1 col2 |
    +-------------------+

主键(ID和LOB)

表2:


    +-----------------+
    | SK ID col3 col4 |
    +-----------------+

主键(SK)

需要从表2到table1给出多对一的关系,因为table1具有compositePrimaryKey(ID和LOB),table2没有任何与LOB相关的列.我无法提供映射.请帮忙.

编辑我已经尝试了Table2的hibernate映射:

<many-to-one name="class1Obj" class="com.acs.enterprise.common.Class1" 
            lazy="proxy" insert="false" update="false">
    <column name="ID" />
    <column name="LOB" />
</many-to-one>
Run Code Online (Sandbox Code Playgroud)

以上不起作用.在获取记录时,它尝试从table2获取LOB代码,这在表1中根本不存在

java database orm hibernate hibernate-mapping

10
推荐指数
1
解决办法
498
查看次数

Spring和/或Hibernate:在表单提交后从一方保存多对多关系

上下文

我有两个实体之间的简单关联 - CategoryEmail(NtoM).我正在尝试创建用于浏览和管理它们的Web界面.我有一个简单的电子邮件订阅编辑表单,其中包含表示给定电子邮件所属类别的复选框列表(我注册了Set<Category>类型的属性编辑器).

问题

表格显示效果很好,包括标记当前指定的类别(对于现有的电子邮件).但是没有更改保存到EmailsCategories表(NtoM映射表,定义的表@JoinTable- 既没有添加新检查的类别,也没有删除未选中的类别.

代码

邮件实体:

@Entity
@Table(name = "Emails")
public class Email
{
    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid2")
    @Column(length = User.UUID_LENGTH)
    protected UUID id;

    @NaturalId
    @Column(nullable = false)
    @NotEmpty
    @org.hibernate.validator.constraints.Email
    protected String name;

    @Column(nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    protected Date createdAt;

    @Column
    protected String realName;

    @Column(nullable = false)
    protected boolean isActive = true;

    @ManyToMany(mappedBy = "emails", fetch = FetchType.EAGER)
    protected Set<Category> categories = new HashSet<Category>(); …
Run Code Online (Sandbox Code Playgroud)

many-to-many hibernate jpa spring-mvc hibernate-mapping

9
推荐指数
1
解决办法
2万
查看次数

Hibernate - Custom Dialect的BigDecimal列映射

我正在使用Hibernate作为我们的对象关系映射,使用一个隐藏数据库的自定义方言.

我从这个数据库中检索的实体有一列:

    @Column(name = "GROSS_WEIGHT", precision = 9, scale = 3)
    private BigDecimal grossWeight;
Run Code Online (Sandbox Code Playgroud)

数据库将此列定义为数字,精度为9,标度为3.

我可以看到Hibernate生成的SQL来检索数据,当我使用数据库查询工具执行相同的Query时,它会返回GROSS_WEIGHT列的"9.68".

但是,在由Hibernate检索的实体中,'grossWeight'字段包含值'10',其中scale0和precision2 为0 !

在我正在使用的自定义方言类中,我尝试重写以下列类型:

        registerColumnType( Types.DECIMAL, "numeric($p,$s)" );
        registerColumnType( Types.DOUBLE, "numeric($p,$s)" );
        registerColumnType( Types.NUMERIC, "numeric($p,$s)" );
Run Code Online (Sandbox Code Playgroud)

但它仍然只返回(舍入的)整数.

这在我们使用Postgres方言从Postgres检索对象的应用程序的其他地方有效.

知道我应该在方言中做什么,所以我可以让Hibernate正确设置检索到的BigDecimal的精度/比例?

java hibernate jpa bigdecimal hibernate-mapping

9
推荐指数
1
解决办法
4638
查看次数

HIbernate映射异常:PropertyNotFoundException:找不到setter

我有两个POJO,STOCK和STOCK_DETAILS(一对多的关系).我还有一个接口IAUDITLOG(有两种方法).我需要用BOTH POJO实现这个接口,并希望在这些方法中编写一些实现.但是当我用子类"STOCKDETAILS"实现IAUDITLOG接口时,它会给出异常"你应该有setter属性"

股票类别:

@Entity
@Table(name = "stock")
public class Stock implements java.io.Serializable, IAuditLog
{   
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer stockId;

    @Column(name = "STOCK_CODE")
    private String stockCode;

    @Column(name = "STOCK_NAME")
    private String stockName;

    @OneToMany( fetch = FetchType.LAZY, mappedBy = "stock")
    public Set<StockDetail> stockDetails = new HashSet<StockDetail>(0);


    public Set<StockDetail> getStockDetails() {
        return stockDetails;
    }

    public void setStockDetails(Set<StockDetail> stockDetails) {
        this.stockDetails = stockDetails;
    }

    public Integer getStockId() {
        return stockId;
    }

    public void setStockId(Integer stockId) { …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate hibernate-mapping

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

Hibernate有很多对很多 - fetch方法渴望与懒惰

Hibernate新手.

我有多个用户组关系.三个表:User,Group和UserGroup映射表.

实体:

@Entity
@Table(name = "user")
public class User {

@Id
@Column (name = "username")
private String userName;

@Column (name = "password", nullable = false)
private String password;


@ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@JoinTable(name="usergroup", 
            joinColumns={@JoinColumn(name="username")}, 
            inverseJoinColumns={@JoinColumn(name="groupname")})
private Set<Group> userGroups = new HashSet<Group>();

... setter and getters



@Entity
@Table(name = "group")
public class Group {

@Id
@Column(name = "groupname")
private String groupName;

@Column(name = "admin", nullable = false)
private String admin;

@ManyToMany(mappedBy = "userGroups", fetch = FetchType.EAGER)
private Set<User> …
Run Code Online (Sandbox Code Playgroud)

java orm many-to-many hibernate hibernate-mapping

9
推荐指数
2
解决办法
3万
查看次数

在@ElementCollection上指定主键

因此,如果某些表缺少主键,那么innodb的行为可能会导致问题.

因此,对于Hibernate,我正在寻找一个键来指定@ElementCollection表上的主键,其中Set为底层数据结构.

我找到了一种使用地图的主键的方法,但它有点奇怪,因为我不需要地图.

我还找到了与@Embeddable相关的答案,但我不需要那种复杂性.我在我的实体中使用Set或Set作为数据结构.

知道如何实现吗?

java orm hibernate jpa hibernate-mapping

9
推荐指数
2
解决办法
5691
查看次数

可以自动扫描包来自动创建SessionFactory吗?

我可以配置Hibernate自动扫描包创建一个SessionFactory@Entity注释豆?

目前我正在使用

Configuration config = new Configuration() ;
config.addAnnotatedClass(MyEntity.class);
Run Code Online (Sandbox Code Playgroud)

我不想hibernate.cfg.xml用来配置映射.

请注意我想在普通的Java项目中实现这一点,而不使用任何Spring或此类框架.

使用Spring之前已经回答了类似的问题,但我想在不使用Spring或其他框架的情况下实现它.我对一些这样做的简单库开放.

java hibernate hibernate-mapping

9
推荐指数
1
解决办法
2570
查看次数

如何更改Hibernate CharacterTypeDescriptor以处理空列值

我们的问题是,由于源自Hibernate ,我们无法从遗留数据库中获取数据(包括长度为0的字符串).我们想改变Hibernate的行为以正确解析空字符串.StringIndexOutOfBoundsExceptiionCharacterTypeDescriptor

示例数据:

1, 'Berlin', 17277, '', 'aUser'
2, 'London', 17277, '', 'anotherUser'
Run Code Online (Sandbox Code Playgroud)

我们使用hibernate javax.persistence.Query.

String sql = "SELECT * FROM table";
Query query = entityManager.createNativeQuery(sql);
List resultList = query.getResultList();
Run Code Online (Sandbox Code Playgroud)

这导致StringIndexOutOfBoundsException它的根是来自Hibernate的以下代码:

if ( String.class.isInstance( value ) ) {
   final String str = (String) value;
   return Character.valueOf( str.charAt(0) );  // this fails, as there is no char at position 0
}
Run Code Online (Sandbox Code Playgroud)

hibernate论坛上的帖子证实了这一点.

我们没有选择从这个错误的版本升级hibernate,并寻找一种方法来改变Hibernate的映射.

我们不能使用PreparedStatements或普通的JDBC-Connections,也不能使用JPA-Entities.

也不可能改变遗留数据库.SQL语句使用DBVisualizer完美运行.

有没有改变Hibernate映射字符串的方式?

java hibernate jpa hibernate-mapping

9
推荐指数
1
解决办法
2097
查看次数

使用Spring Data时,如何注册自定义Hibernate 5数据类型(BasicType)?

我使用Spring Data并决定创建可以在Hibernate实体中使用的新自定义数据类型.我检查了文档,BasicType并根据此官方用户指南选择并实施它.

我希望能够在其类名下注册该类型,并且能够在实体中使用新类型而无需@Type注释.不幸的是,我无法引用MetadataBuilder或Hibernate配置来注册新类型.有没有办法在Spring Data中获取它?似乎Hibernate的初始化对用户是隐藏的,并且不能轻易访问.我们使用以下类来初始化JPA:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactory",
        transactionManagerRef = "transactionManager",
        basePackages = {
                "..." // omitted
        }
)
public class JpaConfiguration implements TransactionManagementConfigurer {

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean configureEntityManagerFactory(
        DataSource dataSource,
        SchemaPerTenantConnectionProviderImpl provider) {

        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setPersistenceUnitName("defaultPersistenceUnit");
        entityManagerFactoryBean.setDataSource(dataSource);
        entityManagerFactoryBean.setPackagesToScan(
                "..." // omitted
        );
        entityManagerFactoryBean.setJpaProperties(properties(provider));
        entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        return entityManagerFactoryBean;
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return new JpaTransactionManager();
    }

    private Properties properties(SchemaPerTenantConnectionProviderImpl …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate hibernate-mapping spring-data

9
推荐指数
4
解决办法
4322
查看次数