我正在尝试使用 maven 来学习 Spring、Hibernate 和 H2 数据库来构建代码。目前,我遇到一些问题,如何正确使用@Transactional注释来自动启动事务并在entityManager.persist成功完成或回滚时提交事务。
我的测试项目非常简单。POJO 类是 Person,包含名字、姓氏和电子邮件地址。有一个 Service 类 PersonSerice,它是一个提供 CRUD 功能来添加、更改、读取和删除人员数据的接口。有一个 PersonServiceImpl 调用 DAO 类的方法。这里是方法 PersonDAOImpl::createPerson 使用的示例代码
public void createPerson(Person person) {
entityManager.getTransaction().begin();
entityManager.persist(person);
entityManager.getTransaction().commit();
}
Run Code Online (Sandbox Code Playgroud)
一切都按预期进行。有一个 Hibernate SQL 输出
“Hibernate:调用 hibernate_sequence 的下一个值 Hibernate:插入到 person (email, nachname, vorname, id) 值 (?, ?, ?, ?)”
我想摆脱手动调用entityManager.getTransaction().commit(); 所以我尝试在调用DAO方法的ServiceImpl方法处写@Transactional
public void createPerson(Person person) {
entityManager.getTransaction().begin();
entityManager.persist(person);
entityManager.getTransaction().commit();
}
Run Code Online (Sandbox Code Playgroud)
现在它无法正常工作。我刚刚明白了。“ Hibernate:调用 hibernate_sequence 的下一个值” 有一些内容写入数据库,但如果不手动提交,我无法列出所有条目或删除它们。所以我目前不知道出了什么问题以及如何让 @Transactional 自动执行提交。下面是 Eclipse 调试器中显示的实体管理器内容的一部分:
entityManager $Proxy26 (id=33) h ExtendedEntityManagerCreator$ExtendedEntityManagerInitationHandler (id=116)
containerManaged false
exceptionTranslator null jta …
我正在尝试将我的项目与db连接.我有一个已经连接并在此数据库上运行的项目.我需要第二个并使用jms在它们之间进行通信.我配置secon连接到同一个数据库,它不工作.好的连接还可以.当我创建Entity类然后在db中我看到新表.很好.但我写的控制器应该注入实体管理器,它总是为空.我不知道为什么.这是我的配置.
@Configuration
@ComponentScan(basePackages = { "**.*****.**********" })
public class CalculationWorkerRootConfig {
@Bean
public static PropertyPlaceholderConfigurer propertyPlaceholderConfigurer() {
PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
ppc.setLocation(new ClassPathResource("/persistence.properties"));
return ppc;
}
}
Run Code Online (Sandbox Code Playgroud)
这是经理配置器:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories
public class CalculationWorkerPersistenceConfig implements TransactionManagementConfigurer {
@Value("${dataSource.driverClassName}")
private String driver;
@Value("${dataSource.url}")
private String url;
@Value("${dataSource.username}")
private String username;
@Value("${dataSource.password}")
private String password;
@Value("${hibernate.dialect}")
private String dialect;
@Value("${hibernate.hbm2ddl.auto}")
private String hbm2ddlAuto;
@Bean
public DataSource configureDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
@Bean …
Run Code Online (Sandbox Code Playgroud) 我在 java 中收到此错误消息。
你们中有人知道我该如何解决这个问题吗?
HTTP Status 500 - Filter execution threw an exception
类型 Exception report
信息 Filter execution threw an exception
描述 The server encountered an internal error that prevented it from fulfilling this request.
例外
javax.servlet.ServletException: Filter execution threw an exception
root cause
java.lang.Error: Unresolved compilation problem:
The method createNamedQuery(String) in the type EntityManager is not applicable for the arguments (String, Class<User>)
bg.tu_sofia.cinema.dao.UserDAOImpl.getAllUsers(UserDAOImpl.java:22)
bg.tu_sofia.cinema.dao.UserDAOImpl.usernameExists(UserDAOImpl.java:52)
bg.tu_sofia.cinema.filters.UserReconcilerFilter.doFilter(UserReconcilerFilter.java:54)
note The full stack trace of the root cause is available in the …
Run Code Online (Sandbox Code Playgroud) 我正在我的Repository类中扩展CrudRepository.我想使用findAll方法打印表格中的记录.到目前为止,我已经编写了一个测试类,我可以看到结果查询是正确的.如何在表格中打印单个记录?
这是我的代码片段:Repository Class
public interface RepositoryAda extends CrudRepository{
}
Run Code Online (Sandbox Code Playgroud)
服务类
@Service
public class Service{
@Autowired private RepositoryAda repository;
@Transactional
public List selectRecords(){
return (List) repository.findAll();
}
}
Run Code Online (Sandbox Code Playgroud)
测试用例:
@Test
public void getAllRecords() {
service.selectRecords();
}
Run Code Online (Sandbox Code Playgroud)
如何将表中的各个记录打印到控制台?
我创建了一个自定义验证器来检查两个数据库表中是否存在电子邮件.
namespace AgriHealth\AhpBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class UniqueEmailAll extends Constraint
{
public $message = 'This email is already in use';
public function validatedBy()
{
return get_class($this).'Validator';
}
}
namespace AgriHealth\AhpBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
class UniqueEmailAllValidator extends ConstraintValidator
{
private $entityManager;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function validate($value, Constraint $constraint)
{
$find1 = $this->entityManager->getRepository( 'AgriHealthAhpBundle:Vet')->findOneByEmail($value);
$find2 = $this->entityManager->getRepository( 'AgriHealthAhpBundle:Farmer')->findOneByEmail($value);
if ($find1 || $find2) {
// If you're using the new 2.5 validation …
Run Code Online (Sandbox Code Playgroud) Mockito.when
为下面的代码行获取空指针异常。
when(entityManager.createQuery(any(String.class)).setParameter(any(String.class), any(String.class)).getSingleResult()).thenReturn("2");
Run Code Online (Sandbox Code Playgroud)
试图模拟声明为的实体管理器
@Mock
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)
任何帮助解决这个问题?
完成测试类
@RunWith(MockitoJUnitRunner.class)
public class ASDAOImplTest {
@InjectMocks
ASDAOImpl asdaoImpl=new ASDAOImpl();
@Mock
private EntityManager entityManager;
@Before
public void setUp()
{
ReflectionTestUtils.setField(asdaoImpl,"capLimit", 1);
}
@Test
@Ignore
public void validateCappingTest()
{
when(entityManager.createQuery(any(String.class)).setParameter(any(String.class), any(String.class)).getSingleResult()).thenReturn("2");
asdaoImpl.validateCapping("2");
}
}
Run Code Online (Sandbox Code Playgroud) 我使用了这个JPA:检查实体对象是否已被持久化, 以确定我是否持久化或合并我的实体,它将如下所示:
if (!getEntityManager().contains(entity)) {
System.out.println(" PERSIST ");
} else {
System.out.println(" MERGE ");
}
Run Code Online (Sandbox Code Playgroud)
案例是 - 即使我编辑我的实体 - 它也不会被识别为合并.
怎么可能以及如何使它工作?
我正在尝试通过 BaseRepository 接口和 BaseRepositoryImpl 扩展 **SimpleJpaRepository **。
\nTha BaseRepositoryImpl 扩展 **SimpleJpaRepository ** 并实现 BaseRepository。
此外,我还有一些其他存储库,例如扩展了 BaseRepository 的 CandidateRepository 和 EmployeeRepository。
\n\n下面您可以看到错误后的代码:
\n\n\n\n @NoRepositoryBean \n public interface BaseRepository<T, ID extends Serializable> extends JpaRepository<T, ID>{\n//..\n}\n\n\n@Repository\npublic abstract class BaseRepositoryImpl<T, ID extends Serializable> extends \n SimpleJpaRepository<T, ID> implements BaseRepository<T, ID>{\n\n private final EntityManager em;\n\n public BaseRepositoryImpl(JpaEntityInformation<T,ID> entityInformation, \n EntityManager entityManager) {\n\n super(entityInformation, entityManager);\n this.em = entityManager;\n\n }\n //..\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n扩展存储库:
\n\n@NoRepositoryBean\n public interface CandidateRepository extends BaseRepository<DatCandidate, UUID>{\n\n //..\n }\n\n\n@Repository(value="CandidateRepositoryImpl")\npublic …
Run Code Online (Sandbox Code Playgroud) 我在代码中遇到了一些麻烦。我一直在尝试此网站上所有可能的解决方案,但没有任何效果。我似乎无法理解可能是什么问题。
我尝试过的解决方案的链接:
Spring Boot,JPA错误:“通过JDBC语句执行DDL错误”
系统配置:Ubuntu 16.04 MySQL 8
2018-11-06 12:38:52.273 INFO 16491 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
Hibernate: create table outputmessages (id integer not null, from varchar(255), message varchar(255), time datetime, topic varchar(255), primary key (id)) engine=InnoDB
2018-11-06 12:38:53.117 WARN 16491 --- [ main] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:559) [hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:504) [hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at …
Run Code Online (Sandbox Code Playgroud) 我在我的表中添加了一个新闻关系,在 postUp() 方法中我想更新我的所有线程。
我如何访问迁移类中的 EntityManager 以获取我的所有线程、更新它们并保留/刷新我的修改?
entitymanager ×10
java ×6
spring ×4
hibernate ×2
jpa ×2
symfony ×2
doctrine ×1
doctrine-orm ×1
jakarta-ee ×1
jpa-2.0 ×1
jpa-2.1 ×1
junit ×1
junit4 ×1
migration ×1
mysql ×1
repository ×1
symfony-2.5 ×1
transactions ×1
validation ×1