should be mapped with insert="false" update="false"的解决方法 和对象产生默认值的解决方法

本文解决Java Web开发中Hibernate映射错误,详细介绍了如何处理同一属性列对应多个属性的问题,并给出了解决方案。同时,文章还讨论了实体类中使用基本类型与包装类型的区别。

问题 一 :Java  web  开发的时候出现这个错误should be mapped with insert="false" update="false"  提示属性列添加insert="false" update="false"   就ok

  出现问题的原因:多个属性对应一个属性列,如下所示:

               <property name="companyCode" type="string">
                       <column name="公司编码" length="12" />
               </property>

             <many-to-one name="sealCompanyInfo" column="公司编码"  class="com.zhuotai.app.entity.SealCompanyInfo" not-null="true"></many-to-one>

      在网上查:删除一个就OK,可是我目前的需求是 既想保留属性列,有想保留实体关系配置,结果摸索了半天,终于找到了答案,哈哈哈,只怪自己太笨了,没有能及时的转换方法解决问题。接下来和大家分享下解决方法。如下:

               <property name="companyCode" type="string">
                       <column name="公司编码" length="12" />
               </property>

             <many-to-one name="sealCompanyInfo" column="公司编码"  class="com.zhuotai.app.entity.SealCompanyInfo" not-null="true"  insert="false" update="false"></many-to-one>

      只要在实体关系配置中添加上insert="false" update="false"就OK.....看来我得好好学习hibernate了。。。。。。学习hibernate,走起。

问题二:没有为对象传任何值,但是调试的时候却出现了值,什么情况,嘿嘿,其实这个问题大家经常犯的

     原因:在实体类中采用基本类型而不是对象

     例如:  采用int 就会有默然值0 ,但是采用 Integer就不会出现了。谨记,谨记

 

      

 

### 解决实体映射列重复问题 实体映射列重复(`reference_id`)通常是由于在实体类中重复定义了相同的列名,或者在 JPA 配置中出现了冲突。需要检查实体类的注解,确保每个列名只定义一次。 例如,以下是一个可能存在问题的实体类: ```java import javax.persistence.Entity; import javax.persistence.Column; import javax.persistence.Id; @Entity public class MyEntity { @Id private Long id; @Column(name = "reference_id") private String referenceId1; @Column(name = "reference_id") private String referenceId2; // 这里重复定义了 reference_id // Getters and setters } ``` 需要修改为: ```java import javax.persistence.Entity; import javax.persistence.Column; import javax.persistence.Id; @Entity public class MyEntity { @Id private Long id; @Column(name = "reference_id") private String referenceId; // Getters and setters } ``` ### 结合 JPA oneToOne 关联查询子表无实体配置的处理 由于子表没有实体配置,不能使用常规的 JPA `OneToOne` 注解关联。可以采用原生 SQL 查询、`@SqlResultSetMapping` 或 `Criteria API` 进行原生查询。 #### 原生 SQL 查询 ```java import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.util.List; import java.util.Map; public class CustomRepository { @PersistenceContext private EntityManager entityManager; public List<Map<String, Object>> performOneToOneQuery() { String sql = "SELECT main_table.id, main_table.name, sub_table.sub_column " + "FROM main_table " + "JOIN sub_table ON main_table.id = sub_table.main_table_id"; return entityManager.createNativeQuery(sql).getResultList(); } } ``` #### `@SqlResultSetMapping` ```java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.SqlResultSetMapping; import javax.persistence.ConstructorResult; import javax.persistence.ColumnResult; import java.util.List; @Entity @SqlResultSetMapping( name = "MainSubMapping", classes = { @ConstructorResult( targetClass = MainSubDto.class, columns = { @ColumnResult(name = "id", type = Long.class), @ColumnResult(name = "name", type = String.class), @ColumnResult(name = "sub_column", type = String.class) } ) } ) class MainSubDto { private Long id; private String name; private String subColumn; public MainSubDto(Long id, String name, String subColumn) { this.id = id; this.name = name; this.subColumn = subColumn; } // Getters and setters } public class CustomRepository { @PersistenceContext private EntityManager entityManager; public List<MainSubDto> performOneToOneQueryWithMapping() { String sql = "SELECT main_table.id, main_table.name, sub_table.sub_column " + "FROM main_table " + "JOIN sub_table ON main_table.id = sub_table.main_table_id"; return entityManager.createNativeQuery(sql, "MainSubMapping").getResultList(); } } ``` #### `Criteria API` 进行原生查询 ```java import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import java.util.List; public class CustomRepository { @PersistenceContext private EntityManager entityManager; public List<Object[]> performOneToOneQueryWithCriteria() { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Object[]> cq = cb.createQuery(Object[].class); Root<MainEntity> mainRoot = cq.from(MainEntity.class); cq.multiselect(mainRoot.get("id"), mainRoot.get("name")); // 这里可以添加连接条件 return entityManager.createQuery(cq).getResultList(); } } ``` ### 确保 Hibernate SessionFactory 正常构建 确保 Hibernate 的配置正确,`SessionFactory` 能够正常创建。可以参考以下配置: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.orm.hibernate5.LocalSessionFactoryBean; import javax.sql.DataSource; import java.util.Properties; @Configuration public class HibernateConfig { @Bean public LocalSessionFactoryBean sessionFactory(DataSource dataSource) { LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setPackagesToScan("com.example.entities"); Properties hibernateProperties = new Properties(); hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect"); hibernateProperties.put("hibernate.show_sql", "true"); sessionFactory.setHibernateProperties(hibernateProperties); return sessionFactory; } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值