需要persistence.xml文件吗?

问题描述 投票:0回答:4

我的开发环境(IBM RAD 8 + WAS 8)抱怨我的项目没有 persistence.xml 文件。看来我仍然可以构建并运行我的项目。该文件是否是必需的?如果添加一个这样的文件以使我的项目通过验证,该文件中应该包含什么?

该项目是一个 Web 项目,它使用来自其他项目的会话 bean 和实体 bean,并且此 persistence.xml 错误是该项目中唯一的错误,因此我很高兴摆脱它。

感谢您的帮助

更新

我在文件中搜索了 persistence.xml,它出现在 EJB 项目的 src/ 和 bin/ 中,而带有 servlet 和 jsp 的 Web 项目没有 persistence.xml,据我的同事说,该 Web 项目正在使用 persistence来自 EJB 项目的 .xml 即:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

    <persistence-unit name="PandoraArendeWeb" transaction-type="JTA">

        <jta-data-source>jdbc/Mainframe_TEST_ADBUTV2</jta-data-source>
        <class>se.prv.pandora.arendeprocess.entity.PRVNummer</class>
        <class>se.prv.pandora.arendeprocess.entity.Ansokan</class>
        <class>se.prv.pandora.arendeprocess.entity.NatAnsokan</class>
        <class>se.prv.pandora.arendeprocess.entity.PctAnsokan</class>
        <class>se.prv.pandora.arendeprocess.entity.ArendePerson</class>
        <class>se.prv.pandora.arendeprocess.entity.Nyregistrering</class>
        <class>se.prv.pandora.arendeprocess.entity.Anstalld</class>
        <class>se.prv.pandora.arendeprocess.entity.Handlaggare</class>
        <class>se.prv.pandora.arendeprocess.entity.OrgElement</class>
        <class>se.prv.pandora.arendeprocess.entity.FysiskHandlaggare</class>
        <class>se.prv.pandora.arendeprocess.entity.AnsvarigHandlaggare</class>
        <class>se.prv.pandora.arendeprocess.entity.AnsvarigFysiskHandlaggare</class>
        <class>se.prv.pandora.arendeprocess.entity.TeknikOmrade</class>
        <class>se.prv.pandora.arendeprocess.entity.Person</class>
        <class>se.prv.pandora.arendeprocess.entity.PRVNummerPerson</class>
        <class>se.prv.pandora.arendeprocess.entity.Notering</class>
        <class>se.prv.pandora.arendeprocess.entity.Lock</class>
        <class>se.prv.pandora.arendeprocess.entity.LandKod</class>
        <class>se.prv.pandora.arendeprocess.entity.ArbetsMomentLog</class>
        <class>se.prv.pandora.arendeprocess.entity.SystemTypDel</class>
        <class>se.prv.pandora.arendeprocess.entity.ArbetsMoment</class>
        <class>se.prv.pandora.arendeprocess.entity.UnderStatus</class>
        <class>se.prv.pandora.arendeprocess.entity.PatPers</class>
        <class>se.prv.pandora.arendeprocess.entity.PrvLandP</class>
        <class>se.prv.pandora.arendeprocess.entity.PkaPerln</class>
        <class>se.prv.pandora.arendeprocess.entity.PctnPerl</class>
        <class>se.prv.pandora.arendeprocess.entity.PersonToPatPersKoppl</class>
        <class>se.prv.pandora.arendeprocess.entity.PRVNummerPersonKoppl</class>
        <class>se.prv.pandora.arendeprocess.entity.Region</class>
        <class>se.prv.pandora.arendeprocess.entity.Historik</class>
        <class>se.prv.pandora.arendeprocess.entity.Egenskap</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>

    </persistence-unit>

<!-- <persistence-unit name="PandoraArendeWeb_MSSQL" transaction-type="JTA">

        <jta-data-source>jdbc/MSSQL_TEST_XA</jta-data-source>
        <class>se.prv.pandora.arendeprocess.entity.PersonSearch</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>

    </persistence-unit>
 -->    
</persistence>

enter image description here

java xml jakarta-ee websphere-8 ibm-rad
4个回答
10
投票

persistence.xml
文件通常包含与数据库相关的详细信息,例如连接字符串及其各自的用户名和密码,包括其他 ORM 相关信息。这些详细信息可以放置在其他位置,因此您不需要明确拥有一个文件,尽管拥有这样一个文件通常可以使所有与持久性相关的信息集中在一个位置,从而更容易查找某些设置和配置。

这是一个示例

persistence.xml
文件:

<?xml version="1.0" encoding="UTF-8"?>
<persistence 
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
    version="1.0">
    <persistence-unit name="<PERSISTENCE UNIT NAME>">
        <properties>
            <!--
            <property name="hibernate.ejb.cfgfile" value="/hibernate.cfg.xml"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
            -->
            <property name="hibernate.archive.autodetection" value="class, hbm"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.password" value="<PASSWORD>"/>
            <property name="hibernate.connection.url" value="jdbc:mysql://<HOST IP ADDRESS>/<DB NAME>"/>
            <property name="hibernate.connection.username" value="<USERNAME>"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="hibernate.c3p0.min_size" value="5"/>
            <property name="hibernate.c3p0.max_size" value="20"/>
            <property name="hibernate.c3p0.timeout" value="300"/>
            <property name="hibernate.c3p0.max_statements" value="50"/>
            <property name="hibernate.c3p0.idle_test_period" value="3000"/>
        </properties>
    </persistence-unit>
</persistence>

以上内容摘自这里


0
投票
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit name="AINS" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

        <class>com.tridenthyundai.ains.domainobject.AccessoriesDO</class>
        <class>com.tridenthyundai.ains.domainobject.BranchDO</class>
        <class>com.tridenthyundai.ains.domainobject.ContactDO</class>
        <class>com.tridenthyundai.ains.domainobject.CustomerDO</class>
        <class>com.tridenthyundai.ains.domainobject.FinanceDO</class>
        <class>com.tridenthyundai.ains.domainobject.InsuranceDO</class>
        <class>com.tridenthyundai.ains.domainobject.MessageDO</class>
        <class>com.tridenthyundai.ains.domainobject.NotificationDO</class>
        <class>com.tridenthyundai.ains.domainobject.ProductDO</class>
        <class>com.tridenthyundai.ains.domainobject.ProductPriceDO</class>
        <class>com.tridenthyundai.ains.domainobject.ProductSpecDO</class>
        <class>com.tridenthyundai.ains.domainobject.ProductVariantDO</class>
        <class>com.tridenthyundai.ains.domainobject.PurchaseDO</class>
        <class>com.tridenthyundai.ains.domainobject.ServiceCentreDO</class>
        <class>com.tridenthyundai.ains.domainobject.ServiceDO</class>
        <class>com.tridenthyundai.ains.domainobject.ServiceTypeDO</class>
        <class>com.tridenthyundai.ains.domainobject.UserDO</class>
        <class>com.tridenthyundai.ains.domainobject.VisitorDO</class>


        <!-- shouldn't be valid for java SE per specification, but it works for  EclipseLink ... -->
        <exclude-unlisted-classes>false</exclude-unlisted-classes>

        <!-- For Local Testing -->
        <!-- <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://saptalabs:3306/tridenthyundai" />
            <property name="javax.persistence.jdbc.user" value="adminuser" />
            <property name="javax.persistence.jdbc.password" value="adminuser" />
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />

            <property name="eclipselink.cache.shared.default" value="false"/>
            <property name="eclipselink.ddl-generation" value="create-tables" />
            <property name="eclipselink.ddl-generation.output-mode" value="database" />
            <property name="eclipselink.logging.level" value="SEVERE" />        
        </properties> -->

        <!-- For Production -->

    </persistence-unit>
</persistence>

0
投票
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit name="saptalabs" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

        <class>com.sapta.hr.domainobject.UserDO</class>
        <class>com.sapta.hr.domainobject.EmployeeDO</class>
        <class>com.sapta.hr.domainobject.AddressDO</class>
        <class>com.sapta.hr.domainobject.EmpDetailDO</class>
        <class>com.sapta.hr.domainobject.EmpAccDetailDO</class>
        <class>com.sapta.hr.domainobject.ProjectDO</class>
        <class>com.sapta.hr.domainobject.CustomerDO</class>
        <class>com.sapta.hr.domainobject.EmpAssignmentDO</class>
        <class>com.sapta.hr.domainobject.EmpAboutDO</class>
        <class>com.sapta.hr.domainobject.EmpAchievementsDO</class>
        <class>com.sapta.hr.domainobject.EmpEmploymentHistoryDO</class>
        <class>com.sapta.hr.domainobject.EmpSportsDO</class>
        <class>com.sapta.hr.domainobject.EmpCulturalsDO</class>
        <class>com.sapta.hr.domainobject.EmpEducationDO</class>
        <class>com.sapta.hr.domainobject.EmpLanguageKnownDO</class>
        <class>com.sapta.hr.domainobject.EmpReferencesDO</class>
        <class>com.sapta.hr.domainobject.EmpSkillSetDO</class>
        <class>com.sapta.hr.domainobject.EmpFamilyBackgroundDO</class>
        <class>com.sapta.hr.domainobject.AssetDO</class>
        <class>com.sapta.hr.domainobject.AssetTypeDO</class>
        <class>com.sapta.hr.domainobject.EmpCTCDO</class>
        <class>com.sapta.hr.domainobject.ExpenseDO</class>
        <class>com.sapta.hr.domainobject.ExpTypeDO</class>
        <class>com.sapta.hr.domainobject.InvoiceDO</class>
        <class>com.sapta.hr.domainobject.PayrollDO</class>
        <class>com.sapta.hr.domainobject.ProfessionalTaxDO</class>
        <class>com.sapta.hr.domainobject.TDSDO</class>
        <class>com.sapta.hr.domainobject.VendorDO</class>
        <class>com.sapta.hr.domainobject.BillsDO</class>
        <class>com.sapta.hr.domainobject.EmpLoseOfPayDO</class>

        <!-- shouldn't be valid for java SE per specification, but it works for 
            EclipseLink ... -->
        <exclude-unlisted-classes>false</exclude-unlisted-classes>

        <!-- For Local Testing -->
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/hrportal" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="root" />
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="eclipselink.cache.shared.default" value="false" />
            <property name="eclipselink.ddl-generation" value="create-tables" />
            <property name="eclipselink.ddl-generation.output-mode"
                value="database" />
            <property name="eclipselink.logging.level" value="SEVERE" />
        </properties>
    </persistence-unit>
</persistence>

0
投票
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;

import com.mongodb.MongoServerException;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.FindOneAndUpdateOptions;
import org.bson.Document;
import org.junit.jupiter.api.Test;

import java.time.Instant;
import java.util.Optional;

class MongoLockProviderTest {

    @Test
    void lock_shouldReturnLockIfInsertSuccessful() {
        // Arrange
        MongoCollection<Document> mockedCollection = mock(MongoCollection.class);
        when(mockedCollection.findOneAndUpdate(any(), any(), any(FindOneAndUpdateOptions.class))).thenReturn(null);

        MongoLockProvider mongoLockProvider = new MongoLockProvider(mockedCollection);

        LockConfiguration lockConfiguration = new LockConfiguration("testLock", Instant.now(), Instant.now());

        // Act
        Optional<SimpleLock> result = mongoLockProvider.lock(lockConfiguration);

        // Assert
        verify(mockedCollection).findOneAndUpdate(any(), any(), any(FindOneAndUpdateOptions.class));
        assert result.isPresent();
    }

    @Test
    void lock_shouldReturnEmptyOptionalIfInsertFailsDueToDuplicateKeyException() {
        // Arrange
        MongoCollection<Document> mockedCollection = mock(MongoCollection.class);
        when(mockedCollection.findOneAndUpdate(any(), any(), any(FindOneAndUpdateOptions.class)))
                .thenThrow(new MongoServerException(11000, "Duplicate key"));

        MongoLockProvider mongoLockProvider = new MongoLockProvider(mockedCollection);

        LockConfiguration lockConfiguration = new LockConfiguration("testLock", Instant.now(), Instant.now());

        // Act
        Optional<SimpleLock> result = mongoLockProvider.lock(lockConfiguration);

        // Assert
        verify(mockedCollection).findOneAndUpdate(any(), any(), any(FindOneAndUpdateOptions.class));
        assert result.isEmpty();
    }

    @Test
    void extend_shouldReturnLockIfUpdateSuccessful() {
        // Arrange
        MongoCollection<Document> mockedCollection = mock(MongoCollection.class);
        when(mockedCollection.findOneAndUpdate(any(), any(), any(FindOneAndUpdateOptions.class)))
                .thenReturn(new Document());

        MongoLockProvider mongoLockProvider = new MongoLockProvider(mockedCollection);

        LockConfiguration lockConfiguration = new LockConfiguration("testLock", Instant.now(), Instant.now());

        // Act
        Optional<SimpleLock> result = mongoLockProvider.extend(lockConfiguration);

        // Assert
        verify(mockedCollection).findOneAndUpdate(any(), any(), any(FindOneAndUpdateOptions.class));
        assert result.isPresent();
    }

    @Test
    void extend_shouldReturnEmptyOptionalIfUpdateFails() {
        // Arrange
        MongoCollection<Document> mockedCollection = mock(MongoCollection.class);
        when(mockedCollection.findOneAndUpdate(any(), any(), any(FindOneAndUpdateOptions.class)))
                .thenReturn(null);

        MongoLockProvider mongoLockProvider = new MongoLockProvider(mockedCollection);

        LockConfiguration lockConfiguration = new LockConfiguration("testLock", Instant.now(), Instant.now());

        // Act
        Optional<SimpleLock> result = mongoLockProvider.extend(lockConfiguration);

        // Assert
        verify(mockedCollection).findOneAndUpdate(any(), any(), any(FindOneAndUpdateOptions.class));
        assert result.isEmpty();
    }

    @Test
    void unlock_shouldUpdateLockUntil() {
        // Arrange
        MongoCollection<Document> mockedCollection = mock(MongoCollection.class);
        when(mockedCollection.findOneAndUpdate(any(), any())).thenReturn(null);

        MongoLockProvider mongoLockProvider = new MongoLockProvider(mockedCollection);

        LockConfiguration lockConfiguration = new LockConfiguration("testLock", Instant.now(), Instant.now());

        // Act
        mongoLockProvider.unlock(lockConfiguration);

        // Assert
        verify(mockedCollection).findOneAndUpdate(any(), any());
    }

    // Add more test cases for other methods and edge cases

}
© www.soinside.com 2019 - 2024. All rights reserved.